<!DOCTYPE HTML>
<html>
<head>
<title>WinGet | AutoHotkey</title>
<meta name="description" content="The WinGet command retrieves the specified window's unique ID, process ID, process name, a list of its controls, or a list of windows." />
<meta name="ahk:equiv-v2" content="commands/Win.htm" />
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

<h1>WinGet</h1>

<p>获取指定窗口的唯一 ID, 进程 ID(PID), 进程名或控件列表. 它还可以获取匹配指定条件的所有窗口的列表.</p>
<pre class="Syntax"><span class="func">WinGet</span>, OutputVar <span class="optional">, <a href="#SubCommands">SubCommand</a>, WinTitle, WinText, ExcludeTitle, ExcludeText</span></pre>

<h2 id="Parameters">参数</h2>
<dl>
  <dt>OutputVar</dt>
  <dd>用来保存 <em>SubCommand</em> 结果的变量名.</dd>

  <dt>SubCommand</dt>
  <dd>要执行的操作, 如果为空默认为 <a href="#ID">ID</a> 子命令. 请参阅<a href="#SubCommands">子命令</a>.</dd>

  <dt>WinTitle</dt>
  <dd>窗口标题或识别目标窗口的其他条件. 请参阅 <a href="../misc/WinTitle.htm">WinTitle</a>.</dd>

  <dt>WinText</dt>
  <dd>如果使用此参数, 那么它必须是目标窗口中单个文本元素的子字符串(和内置的 Window Spy 工具显示的一样). 当 <a href="DetectHiddenText.htm">DetectHiddenText</a> 的设置为 ON 时, 那么会检测到隐藏文本元素.</dd>

  <dt>ExcludeTitle</dt>
  <dd>标题中含有此参数值的窗口将被排除.</dd>

  <dt>ExcludeText</dt>
  <dd>文本中含有此参数值的窗口将被排除.</dd>
</dl>

<h2 id="SubCommands">子命令</h2>
<p>对于 <em>SubCommand</em>, 指定以下命令之一:</p>
<ul>
    <li><a href="#ID">ID</a>: 获取窗口的唯一 ID 号.</li>
    <li><a href="#IDLast">IDLast</a>: 如果找到多个匹配窗口, 它会获取最后的/最下面的窗口唯一 ID.</li>
    <li><a href="#PID">PID</a>: 获取窗口的进程 ID.</li>
    <li><a href="#ProcessName">ProcessName</a>: 获取拥有窗口的进程名.</li>
    <li><a href="#ProcessPath">ProcessPath</a> <span class="ver">[v1.1.01+]</span>: 获取拥有窗口的进程的完整路径和名称.</li>
    <li><a href="#Count">Count</a>: 获取与标题/文本参数匹配的现有窗口的数量.</li>
    <li><a href="#List">List</a>: 与标题/文本参数相匹配的所有现有窗口的唯一 ID 号.</li>
    <li><a href="#MinMax">MinMax</a>: 获取窗口的最小化/最大化状态.</li>
    <li><a href="#ControlList">ControlList</a>: 获取窗口中每个控件的控件名.</li>
    <li><a href="#ControlListHwnd">ControlListHwnd</a> <span class="ver">[v1.0.43.06+]</span>: 获取窗口中每个控件的唯一 ID 号.</li>
    <li><a href="#Transparent">Transparent</a>: 获取窗口的透明度的等级.</li>
    <li><a href="#TransColor">TransColor</a>: 获取在窗口中标记为透明的颜色.</li>
    <li><a href="#Style">Style</a>: 获取表示窗口样式的 8 位十六进制数字.</li>
    <li><a href="#ExStyle">ExStyle</a>: 获取表示窗口扩展样式的 8 位十六进制数字.</li>
</ul>

<h3 id="ID">ID</h3>
<p>获取窗口的唯一 ID 号.</p>
<pre class="Syntax"><span class="func">WinGet</span>, OutputVar, ID <span class="optional">, WinTitle, WinText, ExcludeTitle, ExcludeText</span></pre>
<p>也称为<a href="ControlGet.htm#Hwnd">窗口句柄(HWND)</a>. 如果没有匹配窗口, 那么 <em>OutputVar</em> 被置空. 使用 <a href="WinExist.htm">WinExist()</a> 和 <a href="WinActive.htm">WinActive()</a> 函数也可以获取窗口的 ID; 例如, <code>WinExist("A")</code> 能快速获取活动窗口 ID. 要找出控件的 HWND(用于 <a href="PostMessage.htm">Post/SendMessage</a> 或 <a href="DllCall.htm">DllCall</a>), 请使用 <a href="ControlGet.htm#Hwnd">ControlGet Hwnd</a> 或 <a href="MouseGetPos.htm">MouseGetPos</a>.</p>

<h3 id="IDLast">IDLast</h3>
<p>如果找到多个匹配窗口, 它会获取最后的/最下面的窗口唯一 ID.</p>
<pre class="Syntax"><span class="func">WinGet</span>, OutputVar, IDLast <span class="optional">, WinTitle, WinText, ExcludeTitle, ExcludeText</span></pre>
<p>也称为<a href="ControlGet.htm#Hwnd">窗口句柄(HWND)</a>. 如果没有匹配的窗口, 则 <em>OutputVar</em> 被置空. 如果只有一个匹配, 那么它的效果与 <a href="#ID">ID</a> 子命令相同. 这种特性类似于 <a href="WinActivateBottom.htm">WinActivateBottom</a>.</p>

<h3 id="PID">PID</h3>
<p>获取窗口的<a href="Process.htm">进程 ID</a>.</p>
<pre class="Syntax"><span class="func">WinGet</span>, OutputVar, PID <span class="optional">, WinTitle, WinText, ExcludeTitle, ExcludeText</span></pre>
<p>如果没有匹配的窗口, 则 <em>OutputVar</em> 被置空.</p>

<h3 id="ProcessName">ProcessName</h3>
<p>获取拥有窗口的进程名.</p>
<pre class="Syntax"><span class="func">WinGet</span>, OutputVar, ProcessName <span class="optional">, WinTitle, WinText, ExcludeTitle, ExcludeText</span></pre>
<p>例如, 可能是 "notepad.exe". 如果没有匹配窗口, 那么 <em>OutputVar</em> 被置空.</p>

<h3 id="ProcessPath">ProcessPath <span class="ver">[v1.1.01+]</span></h3>
<p>获取拥有窗口的进程的完整路径和名称.</p>
<pre class="Syntax"><span class="func">WinGet</span>, OutputVar, ProcessPath <span class="optional">, WinTitle, WinText, ExcludeTitle, ExcludeText</span></pre>
<p>例如, 可能是 "C:\Windows\System32\notepad.exe". 如果没有匹配窗口, 那么 <em>OutputVar</em> 被置空.</p>

<h3 id="Count">Count</h3>
<p>获取与标题/文本参数匹配的现有窗口的数量.</p>
<pre class="Syntax"><span class="func">WinGet</span>, OutputVar, Count <span class="optional">, WinTitle, WinText, ExcludeTitle, ExcludeText</span></pre>
<p>如果没有匹配窗口, <em>OutputVar</em> 设为 0. 要统计整个系统的所有窗口数, 请省略所有的四个标题/文本参数. 只有在打开 <a href="DetectHiddenWindows.htm">DetectHiddenWindows</a> 设置时才会包括隐藏窗口.</p>

<h3 id="List">List</h3>
<p>与标题/文本参数相匹配的所有现有窗口的唯一 ID 号.</p>
<pre class="Syntax"><span class="func">WinGet</span>, OutputVar, List <span class="optional">, WinTitle, WinText, ExcludeTitle, ExcludeText</span></pre>
<p>要获取整个系统的所有窗口, 省略所有的四个标题/文本参数. 每个 ID 号保存在名称以 <em>OutputVar</em> 自己的名字开头的变量中(构成一个<a href="../misc/Arrays.htm#pseudo">伪数组</a>), 而 <em>OutputVar</em> 自己则保存了获取的项目数量(没有则为 0). 例如, 如果 <em>OutputVar</em> 是 MyArray 且找到两个匹配的窗口, 那么 MyArray1 会被设置为首个窗口的 ID, MyArray2 被设置为第二个窗口的 ID 时, MyArray 自身被设置为数字 2. 窗口获取的顺序是从最上面到最下面(根据它们在桌面上的堆放顺序). 只有在打开 <a href="DetectHiddenWindows.htm">DetectHiddenWindows</a> 设置时才会包括隐藏窗口. 在<a href="../Functions.htm">函数</a>中, 要创建全局而不是局部的伪数组, 必须在使用此命令前<a href="../Functions.htm#Global">声明</a> MyArray 为全局变量(对于<a href="../Functions.htm#AssumeGlobal">假设全局</a>函数, 反之亦然). 但是, 通常需要对每一个变量进行声明, 否则可能引起<a href="../Functions.htm#ArrayConfusion">混乱的根源</a>.</p>

<h3 id="MinMax">MinMax</h3>
<p>获取窗口的最小化/最大化状态.</p>
<pre class="Syntax"><span class="func">WinGet</span>, OutputVar, MinMax <span class="optional">, WinTitle, WinText, ExcludeTitle, ExcludeText</span></pre>
<p>如果不存在匹配窗口, 则 <em>OutputVar</em> 被置空; 否则, 它被设置为下列数字的其中一个:</p>
<ul>
  <li>-1: 窗口处于最小化状态(使用 <a href="WinRestore.htm">WinRestore</a> 可以让它还原).</li>
  <li>1: 窗口处于最大化状态(使用 <a href="WinRestore.htm">WinRestore</a> 可以让它还原).</li>
  <li>0: 窗口既不处于最小化状态也不处于最大化状态.</li>
</ul>

<h3 id="ControlList">ControlList</h3>
<p>获取窗口中每个控件的控件名.</p>
<pre class="Syntax"><span class="func">WinGet</span>, OutputVar, ControlList <span class="optional">, WinTitle, WinText, ExcludeTitle, ExcludeText</span></pre>
<p>如果没有匹配窗口或窗口中没有控件, 那么 <em>OutputVar</em> 被置空. 否则, 每个控件的名称都包含其类名, 紧接着序号(ClassNN), 如同 Window Spy 显示的那样.</p>
<p>除最后一项外的其他项以换行符结束(`n). 要逐个检查每个控件的名称, 请使用<a href="LoopParse.htm">解析循环</a>, 如同下面的<a href="#ExControlList">示例 #3</a>.</p>
<p>控件是按照 Z 轴顺序排序的, 如果窗口支持选项卡, Z 轴顺序通常与使用 <kbd>Tab</kbd> 的导航顺序相同.</p>

<h3 id="ControlListHwnd">ControlListHwnd <span class="ver">[v1.0.43.06+]</span></h3>
<p>获取窗口中每个控件的唯一 ID 号.</p>
<pre class="Syntax"><span class="func">WinGet</span>, OutputVar, ControlListHwnd <span class="optional">, WinTitle, WinText, ExcludeTitle, ExcludeText</span></pre>
<p>如果没有匹配窗口或窗口中没有控件, 那么 <em>OutputVar</em> 被置空. 否则, 每个唯一 ID 都是控件的<a href="ControlGet.htm#Hwnd">窗口句柄(HWND)</a>. 除最后一项之外的每一项以换行符(`n) 结束.</p>
<p>控件是按照 Z 轴顺序排序的, 如果窗口支持选项卡, Z 轴顺序通常与使用 <kbd>Tab</kbd> 的导航顺序相同.</p>

<h3 id="Transparent">Transparent</h3>
<p>获取窗口的透明度的等级.</p>
<pre class="Syntax"><span class="func">WinGet</span>, OutputVar, Transparent <span class="optional">, WinTitle, WinText, ExcludeTitle, ExcludeText</span></pre>
<p>请参阅 <a href="WinSet.htm">WinSet</a> 了解如何设置透明度. 出现后面这些情况时, <em>OutputVar</em> 被置空: 1) 操作系统低于 Windows XP; 2) 没有匹配窗口; 3) 窗口没有设置透明度等级; 或 4) 其他情况(由操作系统行为引起), 例如设置透明后窗口被最小化, 还原和/或重设大小. 否则, 将存储一个介于 0 和 255 之间的数字, 这里 0 示完全透明的窗口, 而 255 表示不透明的窗口. 例如:</p>
<pre>MouseGetPos,,, MouseWin
WinGet, Transparent, Transparent, ahk_id %MouseWin%  <em>; 透明鼠标光标下的窗口.</em></pre>

<h3 id="TransColor">TransColor</h3>
<p>获取在窗口中标记为透明的颜色.</p>
<pre class="Syntax"><span class="func">WinGet</span>, OutputVar, TransColor <span class="optional">, WinTitle, WinText, ExcludeTitle, ExcludeText</span></pre>
<p>请参阅 <a href="WinSet.htm#TransColor">WinSet</a> 了解如何设置 TransColor. 出现后面这些情况时, <em>OutputVar</em> 被置空: 1) 操作系统低于 Windows XP; 2) 没有匹配窗口; 3) 窗口没有透明色; 或 4) 其他情况(由操作系统行为引起), 例如设置透明后窗口被最小化, 还原和/或重设大小. 否则, 将存储一个六位的十六进制 RGB 颜色值, 例如 0x00CC99. 例如:</p>
<pre>MouseGetPos,,, MouseWin
WinGet, TransColor, TransColor, ahk_id %MouseWin%  <em>; 鼠标光标下的窗口透明色.</em></pre>

<h3 id="Style">Style</h3>
<p>获取表示窗口样式的 8 位十六进制数字.</p>
<pre class="Syntax"><span class="func">WinGet</span>, OutputVar, Style <span class="optional">, WinTitle, WinText, ExcludeTitle, ExcludeText</span></pre>
<p>如果没有匹配窗口, 那么 <em>OutputVar</em> 被置空. 下面的例子判断窗口是否含有 WS_DISABLED 样式:</p>
<pre>WinGet, Style, Style, My Window Title
if (Style &amp; 0x8000000)  <em>; 0x8000000 is WS_DISABLED.</em>
  MsgBox The window is disabled.</pre>
<p>请参阅<a href="../misc/Styles.htm">样式表</a>了解用于样式的部分列表.</p>

<h3 id="ExStyle">ExStyle</h3>
<p>获取表示窗口扩展样式的 8 位十六进制数字.</p>
<pre class="Syntax"><span class="func">WinGet</span>, OutputVar, ExStyle <span class="optional">, WinTitle, WinText, ExcludeTitle, ExcludeText</span></pre>
<p>如果没有匹配窗口, 那么 <em>OutputVar</em> 被置空. 下面的例子判断窗口是否含有 WS_EX_TOPMOST 样式(置顶):</p>
<pre>WinGet, ExStyle, ExStyle, My Window Title
if (ExStyle &amp; 0x8)  <em>; 0x8 is WS_EX_TOPMOST.</em>
   MsgBox The window is always-on-top.</pre>
<p>请参阅<a href="../misc/Styles.htm">样式表</a>了解用于样式的部分列表.</p>

<h2 id="Remarks">备注</h2>
<p>窗口的 ID 号只在窗口的生存期内有效. 换句话说, 如果重启了应用程序, 其所有的窗口都会使用新的 ID 号.</p>
<p>由此命令获取的 ID 号是数字的(不包含前缀 "ahk_id"), 且不论 <a href="SetFormat.htm">SetFormat</a> 如何设置都保存为十六进制格式.</p>
<p>当前鼠标光标下的窗口 ID 可以通过 <a href="MouseGetPos.htm">MouseGetPos</a> 获取.</p>
<p>尽管 ID 号目前是 32 位无符号整数, 但在将来的版本中它们可能会变为 64 位. 因此, 对这些值执行诸如加法之类的数值运算是不可靠的, 因为这些运算需要把输入字符串解析为有符号而不是无符号的整数.</p>
<p>窗口标题和文本是区分大小写的. 只有在打开 <a href="DetectHiddenWindows.htm">DetectHiddenWindows</a> 设置时, 才能检测到隐藏窗口.</p>

<h2 id="Related">相关</h2>
<p><a href="WinGetClass.htm">WinGetClass</a>, <a href="Process.htm">Process</a>, <a href="WinGetTitle.htm">WinGetTitle</a>, <a href="MouseGetPos.htm">MouseGetPos</a>, <a href="ControlGet.htm">ControlGet</a>, <a href="ControlFocus.htm">ControlFocus</a>, <a href="GroupAdd.htm">GroupAdd</a></p>

<h2 id="Examples">示例</h2>

<div class="ex" id="ExID">
<p><a class="ex_number" href="#ExID"></a> 最大化活动窗口并报告其唯一 ID.</p>
<pre>WinGet, active_id, ID, A
WinMaximize, ahk_id %active_id%
MsgBox, The active window's ID is "%active_id%".</pre>
</div>

<div class="ex" id="ExList">
<p><a class="ex_number" href="#ExList"></a> 访问整个系统上所有窗口并显示它们的信息.</p>
<pre>WinGet, id, List,,, Program Manager
Loop, %id%
{
    this_id := id%A_Index%
    WinActivate, ahk_id %this_id%
    WinGetClass, this_class, ahk_id %this_id%
    WinGetTitle, this_title, ahk_id %this_id%
    MsgBox, 4, , Visiting All Windows`n%A_Index% of %id%`nahk_id %this_id%`nahk_class %this_class%`n%this_title%`n`nContinue?
    IfMsgBox, NO, break
}</pre>
</div>

<div class="ex" id="ExControlList">
<p><a class="ex_number" href="#ExControlList"></a> 从活动窗口的控件列表中提取每个控件的名称.</p>
<pre>WinGet, ActiveControlList, ControlList, A
Loop, Parse, ActiveControlList, `n
{
    MsgBox, 4,, Control #%A_Index% is "%A_LoopField%". Continue?
    IfMsgBox, No
        break
}</pre>
</div>

<div class="ex" id="ExRealTime">
<p><a class="ex_number" href="#ExRealTime"></a> 实时显示活动窗口的控件列表.</p>
<pre>#Persistent
SetTimer, WatchActiveWindow, 200
return

WatchActiveWindow:
WinGet, ControlList, ControlList, A
ToolTip, %ControlList%
return</pre>
</div>

</body>
</html>